package tateti;

/**
 *
 * @author Rodrigo
 * Esta clase representa al tablero donde se juega al ta-te-ti de 5x5
 */
public class Tablero {

	// 0 - es que la casilla esta vacia
	// 1 - hay una X en la casilla
	// 2 - Hay una O en la casilla
	private int[][] tab;
	private int n = 5;

	public Tablero() {
		tab = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				tab[i][j] = 0;
			}
		}
	}

	public Tablero(Tablero t) {
		tab = new int[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				tab[i][j] = t.tab[i][j];
			}
		}
	}

	public String getElem(int i, int j) {
		if (tab[i][j] == 0) {
			return "";
		} else if (tab[i][j] == 1) {
			return "X";
		} else {
			return "O";
		}
	}

	public void setElem(int i, int j, String elem) {
		if (elem.equals("")) {
			tab[i][j] = 0;
		} else if (elem.equals("X")) {
			tab[i][j] = 1;
		} else {
			tab[i][j] = 2;
		}
	}

	public int cantLineasLargoL(String tipoPieza, int l) {
		int cantLineas = 0;
		int pieza = 2;
		if (tipoPieza.equals("X")) {
			pieza = 1;
		}

		// calculo la cantidad de lineas por filas
		for (int i = 0; i < n; i++) {
			int cantP = 0;
			int j = 0;
			while ((j < n) && (tab[i][j] == pieza || tab[i][j] == 0)) {
				if (tab[i][j] == pieza) {
					cantP++;
				}
				j++;
			}
			if ((cantP == l) && (j >= n)) {
				cantLineas++;
			}
		}

		// calculo la cantidad de lineas por columnas
		for (int j = 0; j < n; j++) {
			int cantP = 0;
			int i = 0;
			while ((i < n) && (tab[i][j] == pieza || tab[i][j] == 0)) {
				if (tab[i][j] == pieza) {
					cantP++;
				}
				i++;
			}
			if ((cantP == l) && (i >= n)) {
				cantLineas++;
			}
		}

		// calculo la cantidad de lineas para la diagonal de izquierda a derecha
		int j = 0;
		int i = 0;
		int cantP = 0;
		while ((i < n) && (tab[i][j] == pieza || tab[i][j] == 0)) {
			if (tab[i][j] == pieza) {
				cantP++;
			}
			j++;
			i++;
		}
		if ((cantP == l) && (i >= n)) {
			cantLineas++;
		}

		// calculo la cantidad de lineas para la diagonal de derecha a izquierda
		j = n - 1;
		i = 0;
		cantP = 0;
		while ((i < n) && (tab[i][j] == pieza || tab[i][j] == 0)) {
			if (tab[i][j] == pieza) {
				cantP++;
			}
			j--;
			i++;
		}
		if ((cantP == l) && (i >= n)) {
			cantLineas++;
		}

		return cantLineas;
	}

	// retorna "X" si ganaron las X
	// retorna "O" si ganaron las O
	// retorna "Empate" si hubo empate
	// retorna null si no hay ganador
	public String getGanador() {
		if (this.cantLineasLargoL("X", n) > 0) {
			return "X";
		} else if (this.cantLineasLargoL("O", n) > 0) {
			return "O";
		} else {
			boolean hayEmpate = true;
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					if (tab[i][j] == 0) {
						hayEmpate = false;
					}
				}
			}
			if (hayEmpate) {
				return "Empate";
			} else {
				return null;
			}
		}
	}

	public String toString() {
		String ret = "";
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (tab[i][j] == 0) {
					ret += " ";
				}else if(tab[i][j] == 1){
					ret += "X";
				}else{
					ret += "O";
				}
				ret += " | ";
			}
			ret += "\n";
			for (int k = 0; k < n*4; k++) {
				ret += "-";
			}
			ret += "\n";
		}
		return ret;
	}
}
